package com.imooc.spring.aop.aspect;

import org.aspectj.lang.ProceedingJoinPoint;

import java.text.SimpleDateFormat;
import java.util.Date;

public class MethodChecker {
    /**
     * 环绕通知
     * ProceedingJoinPoint是JoinPoint的升级版，在原有功能外，还可以控制目标方法是否执行
     * @param pjp
     * @return
     * @throws Throwable
     */
    public Object check(ProceedingJoinPoint pjp) throws Throwable {
        try{
            long start = new Date().getTime();
            Object ret = pjp.proceed(); //执行目标方法
            long end = new Date().getTime();
            long duration = end - start;
            if (duration >= 1000) {
                //获取连接点的类名
                String className = pjp.getTarget().getClass().getName();
                //获取连接点的方法名
                String methodName = pjp.getSignature().getName();
                //当前时间
                String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(new Date());

                System.out.println("=========" + now + ":" + className + "." + methodName + "执行时间：" + duration + "ms=========");
            }
            return ret;
        }catch(Throwable e){
            System.out.println("发生异常，方法执行失败:" + e.getMessage());
            throw e; //抛出异常
        }
    }
}
